home *** CD-ROM | disk | FTP | other *** search
/ Visual Cafe 3 / Visual Cafe 3.ISO / Vcafe / Main.bin / Character.java < prev    next >
Text File  |  1998-09-22  |  81KB  |  1,492 lines

  1. // This file was generated AUTOMATICALLY from a template file Fri Jun 19 11:07:53 PDT 1998
  2. /*
  3.  * @(#)Character.java    1.44 98/07/10
  4.  *
  5.  * Copyright 1995-1998 by Sun Microsystems, Inc.,
  6.  * 901 San Antonio Road, Palo Alto, California, 94303, U.S.A.
  7.  * All rights reserved.
  8.  * 
  9.  * This software is the confidential and proprietary information
  10.  * of Sun Microsystems, Inc. ("Confidential Information").  You
  11.  * shall not disclose such Confidential Information and shall use
  12.  * it only in accordance with the terms of the license agreement
  13.  * you entered into with Sun.
  14.  */
  15.  
  16. package java.lang;
  17.  
  18. /**
  19.  * The Character class wraps a value of the primitive type <code>char</code> 
  20.  * in an object. An object of type <code>Character</code> contains a 
  21.  * single field whose type is <code>char</code>. 
  22.  * <p>
  23.  * In addition, this class provides several methods for determining 
  24.  * the type of a character and converting characters from uppercase 
  25.  * to lowercase and vice versa. 
  26.  * <p>
  27.  * Many of the methods of class <code>Character</code> are defined 
  28.  * in terms of a "Unicode attribute table" that specifies 
  29.  * a name for every defined Unicode code point. The table also 
  30.  * includes other attributes, such as a decimal value, an uppercase 
  31.  * equivalent, a lowercase equivalent, and/or a titlecase equivalent. 
  32.  * The Unicode attribute table is available on the World Wide Web as 
  33.  * the file:
  34.  * <ul><code>
  35.  *   ftp://unicode.org/pub/MappingTables/UnicodeData1.1.5.txt
  36.  * </code></ul>
  37.  * <p>
  38.  * For a more detailed specification of the <code>Character</code> 
  39.  * class, one that encompasses the exact behavior of methods such as 
  40.  * <code>isDigit</code>, <code>isLetter</code>, 
  41.  * <code>isLowerCase</code>, and <code>isUpperCase</code> over the 
  42.  * full range of Unicode values, see Gosling, Joy, and Steele, <i>The 
  43.  * Java Language Specification</i>. 
  44.  *
  45.  * @author  Lee Boynton
  46.  * @author  Guy Steele
  47.  * @author  Akira Tanaka
  48.  * @version 1.44 07/10/98
  49.  * @since   JDK1.0
  50.  */
  51. public final
  52. class Character extends Object implements java.io.Serializable {
  53.     /**
  54.      * The minimum radix available for conversion to and from Strings.  
  55.      * The constant value of this field is the smallest value permitted 
  56.      * for the radix argument in radix-conversion methods such as the 
  57.      * <code>digit</code> method, the <code>forDigit</code>
  58.      * method, and the <code>toString</code> method of class 
  59.      * <code>Integer</code>. 
  60.      *
  61.      * @see     java.lang.Character#digit(char, int)
  62.      * @see     java.lang.Character#forDigit(int, int)
  63.      * @see     java.lang.Integer#toString(int, int)
  64.      * @see     java.lang.Integer#valueOf(java.lang.String)
  65.      * @since   JDK1.0
  66.      */
  67.     public static final int MIN_RADIX = 2;
  68.  
  69.     /**
  70.      * The maximum radix available for conversion to and from Strings.
  71.      * The constant value of this field is the largest value permitted 
  72.      * for the radix argument in radix-conversion methods such as the 
  73.      * <code>digit</code> method, the <code>forDigit</code>
  74.      * method, and the <code>toString</code> method of class 
  75.      * <code>Integer</code>. 
  76.      *
  77.      * @see     java.lang.Character#digit(char, int)
  78.      * @see     java.lang.Character#forDigit(int, int)
  79.      * @see     java.lang.Integer#toString(int, int)
  80.      * @see     java.lang.Integer#valueOf(java.lang.String)
  81.      * @since   JDK1.0
  82.      */
  83.     public static final int MAX_RADIX = 36;
  84.  
  85.     /**
  86.      * The constant value of this field is the smallest value of type 
  87.      * <code>char</code>.
  88.      *
  89.      * @since   JDK1.0.2
  90.      */
  91.     public static final char   MIN_VALUE = '\u0000';
  92.  
  93.     /**
  94.      * The constant value of this field is the largest value of type 
  95.      * <code>char</code>.
  96.      *
  97.      * @since   JDK1.0.2
  98.      */
  99.     public static final char   MAX_VALUE = '\uffff';
  100.     
  101.     /**
  102.      * The Class object representing the primitive type char.
  103.      *
  104.      * @since   JDK1.1
  105.      */
  106.     public static final Class   TYPE = Class.getPrimitiveClass("char");
  107.     
  108.     /*
  109.      * Public data for enumerated Unicode general category types
  110.      *
  111.      * @since   JDK1.1
  112.      */
  113.     public static final byte
  114.         UNASSIGNED              = 0,
  115.         UPPERCASE_LETTER        = 1,
  116.         LOWERCASE_LETTER        = 2,
  117.         TITLECASE_LETTER        = 3,
  118.         MODIFIER_LETTER         = 4,
  119.         OTHER_LETTER            = 5,
  120.         NON_SPACING_MARK        = 6,
  121.         ENCLOSING_MARK          = 7,
  122.         COMBINING_SPACING_MARK  = 8,
  123.         DECIMAL_DIGIT_NUMBER    = 9,
  124.         LETTER_NUMBER           = 10,
  125.         OTHER_NUMBER            = 11,
  126.         SPACE_SEPARATOR         = 12,
  127.         LINE_SEPARATOR          = 13,
  128.         PARAGRAPH_SEPARATOR     = 14,
  129.         CONTROL                 = 15,
  130.         FORMAT                  = 16,
  131.         PRIVATE_USE             = 18,
  132.         SURROGATE               = 19,
  133.         DASH_PUNCTUATION        = 20,
  134.         START_PUNCTUATION       = 21,
  135.         END_PUNCTUATION         = 22,
  136.         CONNECTOR_PUNCTUATION   = 23,
  137.         OTHER_PUNCTUATION       = 24,
  138.         MATH_SYMBOL             = 25,
  139.         CURRENCY_SYMBOL         = 26,
  140.         MODIFIER_SYMBOL         = 27,
  141.         OTHER_SYMBOL            = 28;
  142.  
  143.     /**
  144.      * The value of the Character.
  145.      */
  146.     private char value;
  147.  
  148.     /** use serialVersionUID from JDK 1.0.2 for interoperability */
  149.     private static final long serialVersionUID = 3786198910865385080L;
  150.  
  151.     /**
  152.      * Constructs a <code>Character</code> object and initializes it so 
  153.      * that it represents the primitive <code>value</code> argument. 
  154.      *
  155.      * @param  value   value for the new <code>Character</code> object.
  156.      * @since   JDK1.0
  157.      */
  158.     public Character(char value) {
  159.         this.value = value;
  160.     }
  161.  
  162.     /**
  163.      * Returns the value of this Character object.
  164.      * @return  the primitive <code>char</code> value represented by
  165.      *          this object.
  166.      * @since   JDK1.0
  167.      */
  168.     public char charValue() {
  169.         return value;
  170.     }
  171.  
  172.     /**
  173.      * Returns a hash code for this Character.
  174.      * @return  a hash code value for this object. 
  175.      * @since   JDK1.0
  176.      */
  177.     public int hashCode() {
  178.         return (int)value;
  179.     }
  180.  
  181.     /**
  182.      * Compares this object against the specified object.
  183.      * The result is <code>true</code> if and only if the argument is not 
  184.      * <code>null</code> and is a <code>Character</code> object that 
  185.      * represents the same <code>char</code> value as this object. 
  186.      *
  187.      * @param   obj   the object to compare with.
  188.      * @return  <code>true</code> if the objects are the same;
  189.      *          <code>false</code> otherwise.
  190.      * @since   JDK1.0
  191.      */
  192.     public boolean equals(Object obj) {
  193.         if ((obj != null) && (obj instanceof Character)) {
  194.             return value == ((Character)obj).charValue();
  195.         } 
  196.         return false;
  197.     }
  198.  
  199.     /**
  200.      * Returns a String object representing this character's value.
  201.      * Converts this <code>Character</code> object to a string. The 
  202.      * result is a string whose length is <code>1</code>. The string's 
  203.      * sole component is the primitive <code>char</code> value represented 
  204.      * by this object. 
  205.      *
  206.      * @return  a string representation of this object.
  207.      * @since   JDK1.0
  208.      */
  209.     public String toString() {
  210.         char buf[] = {value};
  211.         return String.valueOf(buf);
  212.     }
  213.  
  214.    /**
  215.      * Determines if the specified character is a lowercase character. 
  216.      * A character is lowercase if it is not in the range 
  217.      * <code>'\u2000'</code> through <code>'\u2FFF'</code>, the Unicode 
  218.      * attribute table does not specify a mapping to lowercase for the 
  219.      * character, and at least one of the following is true: 
  220.      * <ul>
  221.      * <li>The attribute table specifies a mapping to uppercase for the 
  222.      *     character. 
  223.      * <li>The name for the character contains the words "<code>SMALL 
  224.      *     LETTER</code>". 
  225.      * <li>The name for the character contains the words "<code>SMALL 
  226.      *     LIGATURE</code>". 
  227.      * </ul>
  228.      * <p> A character is considered to be lowercase if and only if
  229.      * it is specified to be lowercase by the Unicode 2.0 standard
  230.      * (category "Ll" in the Unicode specification data file).
  231.      * <p>
  232.      * Of the ISO-LATIN-1 characters (character codes 0x0000 through 0x00FF),
  233.      * the following are lowercase:
  234.      * <p><blockquote><pre>
  235.      * a b c d e f g h i j k l m n o p q r s t u v w x y z
  236.      * \u00DF \u00E0 \u00E1 \u00E2 \u00E3 \u00E4 \u00E5 \u00E6 \u00E7
  237.      * \u00E8 \u00E9 \u00EA \u00EB \u00EC \u00ED \u00EE \u00EF \u00F0
  238.      * \u00F1 \u00F2 \u00F3 \u00F4 \u00F5 \u00F6 \u00F8 \u00F9 \u00FA
  239.      * \u00FB \u00FC \u00FD \u00FE \u00FF
  240.      * </pre></blockquote>
  241.      * <p> Many other Unicode characters are lowercase, too.
  242.      *
  243.      * @param   ch   the character to be tested.
  244.      * @return  <code>true</code> if the character is lowercase;
  245.      *          <code>false</code> otherwise.
  246.      * @see     java.lang.Character#isLowerCase(char)
  247.      * @see     java.lang.Character#isTitleCase(char)
  248.      * @see     java.lang.Character#toLowerCase(char)
  249.      * @since   JDK1.0
  250.      */
  251.     public static boolean isLowerCase(char ch) {
  252.         return (A[Y[(X[ch>>6]<<5)|((ch>>1)&0x1F)]|(ch&0x1)] & 0x1F) == LOWERCASE_LETTER;
  253.     }
  254.  
  255.    /**
  256.      * Determines if the specified character is an uppercase character. 
  257.      * A character is uppercase if it is not in the range 
  258.      * <code>'\u2000'</code> through <code>'\u2FFF'</code>, the Unicode 
  259.      * attribute table does not specify a mapping to uppercase for the 
  260.      * character, and at least one of the following is true: 
  261.      * <ul>
  262.      * <li>The attribute table specifies a mapping to lowercase for the
  263.      *     character. 
  264.      * <li>The name for the character contains the words 
  265.      *     "<code>CAPITAL LETTER</code>".
  266.      * <li>The name for the character contains the words
  267.      *     "<code>CAPITAL LIGATURE</code>".
  268.      * </ul>
  269.      * <p>
  270.      * Of the ISO-LATIN-1 characters (character codes 0x0000 through 0x00FF),
  271.      * the following are uppercase:
  272.      * <p><blockquote><pre>
  273.      * A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
  274.      * \u00C0 \u00C1 \u00C2 \u00C3 \u00C4 \u00C5 \u00C6 \u00C7
  275.      * \u00C8 \u00C9 \u00CA \u00CB \u00CC \u00CD \u00CE \u00CF \u00D0
  276.      * \u00D1 \u00D2 \u00D3 \u00D4 \u00D5 \u00D6 \u00D8 \u00D9 \u00DA
  277.      * \u00DB \u00DC \u00DD \u00DE
  278.      * </pre></blockquote>
  279.      * <p> Many other Unicode characters are uppercase, too.
  280.      *
  281.      * @param   ch   the character to be tested.
  282.      * @return  <code>true</code> if the character is uppercase;
  283.      *          <code>false</code> otherwise.
  284.      * @see     java.lang.Character#isLowerCase(char)
  285.      * @see     java.lang.Character#isTitleCase(char)
  286.      * @see     java.lang.Character#toUpperCase(char)
  287.      * @since   1.0
  288.      */
  289.     public static boolean isUpperCase(char ch) {
  290.         return (A[Y[(X[ch>>6]<<5)|((ch>>1)&0x1F)]|(ch&0x1)] & 0x1F) == UPPERCASE_LETTER;
  291.     }
  292.  
  293.     /**
  294.      * Determines if the specified character is a titlecase character.
  295.      * A character is considered to be titlecase if and only if
  296.      * it is specified to be titlecase by the Unicode 2.0 standard
  297.      * (category "Lt" in the Unicode specification data file).
  298.      * <p>
  299.      * The printed representations of four Unicode characters look like 
  300.      * pairs of Latin letters. For example, there is an uppercase letter 
  301.      * that looks like "LJ" and has a corresponding lowercase letter that 
  302.      * looks like "lj". A third form, which looks like "Lj", 
  303.      * is the appropriate form to use when rendering a word in lowercase 
  304.      * with initial capitals, as for a book title.
  305.      * <p>
  306.      * These are the Unicode characters for which this method returns 
  307.      * <code>true</code>: 
  308.      * <ul>
  309.      * <li><code>LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON</code> 
  310.      * <li><code>LATIN CAPITAL LETTER L WITH SMALL LETTER J</code> 
  311.      * <li><code>LATIN CAPITAL LETTER N WITH SMALL LETTER J</code> 
  312.      * <li><code>LATIN CAPITAL LETTER D WITH SMALL LETTER Z</code> 
  313.      * </ul>
  314.      *
  315.      * @param   ch   the character to be tested.
  316.      * @return  <code>true</code> if the character is titlecase;
  317.      *          <code>false</code> otherwise.
  318.      * @see     java.lang.Character#isLowerCase(char)
  319.      * @see     java.lang.Character#isUpperCase(char)
  320.      * @see     java.lang.Character#toTitleCase(char)
  321.      * @since   JDK1.0.2
  322.      */
  323.     public static boolean isTitleCase(char ch) {
  324.         return (A[Y[(X[ch>>6]<<5)|((ch>>1)&0x1F)]|(ch&0x1)] & 0x1F) == TITLECASE_LETTER;
  325.     }
  326.  
  327.     /**
  328.      * Determines if the specified character is a digit.
  329.      * A character is considered to be a digit if it is not in the range 
  330.      * <code>'\u2000' <= ch <= '\u2FFF'</code>
  331.      * and its Unicode name contains the word 
  332.      * "<code>DIGIT</code>". For a more complete 
  333.      * specification that encompasses all Unicode characters that are 
  334.      * defined as digits, see Gosling, Joy, and Steele, <i>The Java 
  335.      * Language Specification</i>.
  336.      * <p>
  337.      * These are the ranges of Unicode characters that are considered digits:
  338.      * <table>
  339.      * <tr><td>0x0030 through 0x0039</td>
  340.      *                        <td>ISO-LATIN-1 digits ('0' through '9')</td></tr>
  341.      * <tr><td>0x0660 through 0x0669</td>  <td>Arabic-Indic digits</td></tr>
  342.      * <tr><td>0x06F0 through 0x06F9</td>
  343.      *                                <td>Extended Arabic-Indic digits</td></tr>
  344.      * <tr><td>0x0966 through 0x096F</td>  <td>Devanagari digits</td></tr>
  345.      * <tr><td>0x09E6 through 0x09EF</td>  <td>Bengali digits</td></tr>
  346.      * <tr><td>0x0A66 through 0x0A6F</td>  <td>Gurmukhi digits</td></tr>
  347.      * <tr><td>0x0AE6 through 0x0AEF</td>  <td>Gujarati digits</td></tr>
  348.      * <tr><td>0x0B66 through 0x0B6F</td>  <td>Oriya digits</td></tr>
  349.      * <tr><td>0x0BE7 through 0x0BEF</td>  <td>Tamil digits</td></tr>
  350.      * <tr><td>0x0C66 through 0x0C6F</td>  <td>Telugu digits</td></tr>
  351.      * <tr><td>0x0CE6 through 0x0CEF</td>  <td>Kannada digits</td></tr>
  352.      * <tr><td>0x0D66 through 0x0D6F</td>  <td>Malayalam digits</td></tr>
  353.      * <tr><td>0x0E50 through 0x0E59</td>  <td>Thai digits</td></tr>
  354.      * <tr><td>0x0ED0 through 0x0ED9</td>  <td>Lao digits</td></tr>
  355.      * <tr><td>0x0F20 through 0x0F29</td>  <td>Tibetan digits</td></tr>
  356.      * <tr><td>0xFF10 through 0xFF19</td>  <td>Fullwidth digits</td></tr>
  357.      * </table>
  358.      *
  359.      * @param   ch   the character to be tested.
  360.      * @return  <code>true</code> if the character is a digit;
  361.      *          <code>false</code> otherwise.
  362.      * @see     java.lang.Character#digit(char, int)
  363.      * @see     java.lang.Character#forDigit(int, int)
  364.      * @since   JDK1.0
  365.      */
  366.     public static boolean isDigit(char ch) {
  367.         return (A[Y[(X[ch>>6]<<5)|((ch>>1)&0x1F)]|(ch&0x1)] & 0x1F) == DECIMAL_DIGIT_NUMBER;
  368.     }
  369.  
  370.     /**
  371.      * Determines if a character has a defined meaning in Unicode.
  372.      * A character is defined if at least one of the following is true: 
  373.      * <ul>
  374.      * <li>It has an entry in the Unicode attribute table. 
  375.      * <li>Its value is in the range 
  376.      *     <code>
  377.      *     '\u3040' <= ch <= '\u9FA5'</code>. 
  378.      * <li>Its value is in the range 
  379.      *     <code>
  380.      *     '\uF900' <= ch <= '\uFA2D'</code>. 
  381.      * </ul>
  382.      * 
  383.      * @param   ch   the character to be tested
  384.      * @return  <code>true</code> if the character has a defined meaning
  385.      *          in Unicode; <code>false</code> otherwise.
  386.      * @see     java.lang.Character#isDigit(char)
  387.      * @see     java.lang.Character#isLetter(char)
  388.      * @see     java.lang.Character#isLetterOrDigit(char)
  389.      * @see     java.lang.Character#isLowerCase(char)
  390.      * @see     java.lang.Character#isTitleCase(char)
  391.      * @see     java.lang.Character#isUpperCase(char)
  392.      * @since   JDK1.0.2
  393.      */
  394.     public static boolean isDefined(char ch) {
  395.         return (A[Y[(X[ch>>6]<<5)|((ch>>1)&0x1F)]|(ch&0x1)] & 0x1F) != UNASSIGNED;
  396.     }
  397.  
  398.     /**
  399.      * Determines if the specified character is a letter. For a 
  400.      * more complete specification that encompasses all Unicode 
  401.      * characters, see Gosling, Joy, and Steele, <i>The Java Language 
  402.      * Specification</i>. 
  403.      *
  404.      * <p> A character is considered to be a letter if and only if
  405.      * it is specified to be a letter by the Unicode 2.0 standard
  406.      * (category "Lu", "Ll", "Lt", "Lm", or "Lo" in the Unicode
  407.      * specification data file).
  408.      *
  409.      * <p> Note that most ideographic characters are considered
  410.      * to be letters (category "Lo") for this purpose.
  411.      *
  412.      * <p> Note also that not all letters have case: many Unicode characters are
  413.      * letters but are neither uppercase nor lowercase nor titlecase.
  414.      * 
  415.      * @param   ch   the character to be tested.
  416.      * @return  <code>true</code> if the character is a letter;
  417.      *          <code>false</code> otherwise.
  418.      * @see     java.lang.Character#isDigit(char)
  419.      * @see     java.lang.Character#isJavaIdentifierStart(char)
  420.      * @see     java.lang.Character#isJavaLetter(char)
  421.      * @see     java.lang.Character#isJavaLetterOrDigit(char)
  422.      * @see     java.lang.Character#isLetterOrDigit(char)
  423.      * @see     java.lang.Character#isLowerCase(char)
  424.      * @see     java.lang.Character#isTitleCase(char)
  425.      * @see     java.lang.Character#isUnicodeIdentifierStart(char)
  426.      * @see     java.lang.Character#isUpperCase(char)
  427.      * @since   JDK1.0
  428.      */
  429.     public static boolean isLetter(char ch) {
  430.         return (((((1 << UPPERCASE_LETTER) |
  431.                    (1 << LOWERCASE_LETTER) |
  432.                    (1 << TITLECASE_LETTER) |
  433.                    (1 << MODIFIER_LETTER) |
  434.                    (1 << OTHER_LETTER))
  435.                   >> (A[Y[(X[ch>>6]<<5)|((ch>>1)&0x1F)]|(ch&0x1)] & 0x1F)) & 1) != 0);
  436.     }
  437.  
  438.     /**
  439.      * Determines if the specified character is a letter or digit. 
  440.      * For a more complete specification that encompasses all Unicode 
  441.      * characters, see Gosling, Joy, and Steele, <i>The Java Language 
  442.      * Specification</i>. 
  443.      *
  444.      * <p> A character is considered to be a letter if and only if
  445.      * it is specified to be a letter or a digit by the Unicode 2.0 standard
  446.      * (category "Lu", "Ll", "Lt", "Lm", "Lo", or "Nd" in the Unicode
  447.      * specification data file).  In other words, isLetterOrDigit is true
  448.      * of a character if and only if either isLetter is true of the character
  449.      * or isDigit is true of the character.
  450.      * 
  451.      * @param   ch   the character to be tested.
  452.      * @return  <code>true</code> if the character is a letter or digit;
  453.      *          <code>false</code> otherwise.
  454.      * @see     java.lang.Character#isDigit(char)
  455.      * @see     java.lang.Character#isJavaIdentifierPart(char)
  456.      * @see     java.lang.Character#isJavaLetter(char)
  457.      * @see     java.lang.Character#isJavaLetterOrDigit(char)
  458.      * @see     java.lang.Character#isLetter(char)
  459.      * @see     java.lang.Character#isUnicodeIdentifierPart(char)
  460.      * @since   JDK1.0.2
  461.      */
  462.     public static boolean isLetterOrDigit(char ch) {
  463.         return (((((1 << UPPERCASE_LETTER) |
  464.                    (1 << LOWERCASE_LETTER) |
  465.                    (1 << TITLECASE_LETTER) |
  466.                    (1 << MODIFIER_LETTER) |
  467.                    (1 << OTHER_LETTER) |
  468.                    (1 << DECIMAL_DIGIT_NUMBER))
  469.                   >> (A[Y[(X[ch>>6]<<5)|((ch>>1)&0x1F)]|(ch&0x1)] & 0x1F)) & 1) != 0);
  470.     }
  471.  
  472.     /**
  473.      * Determines if the specified character is a 
  474.      * "Java" letter, that is, the character is permissible 
  475.      * as the first character in an identifier in the Java language. 
  476.      * <p>
  477.      * A character is considered to be a Java letter if and only if it 
  478.      * is a letter, the ASCII dollar sign character <code>'$'</code>, or 
  479.      * the underscore character <code>'_'</code>. 
  480.      *
  481.      * @param      ch   the character to be tested.
  482.      * @return     <code>true</code> if the character is a Java letter;
  483.      *             <code>false</code> otherwise.
  484.      * @see        java.lang.Character#isJavaIdentifierStart(char)
  485.      * @see        java.lang.Character#isJavaLetterOrDigit(char)
  486.      * @see        java.lang.Character#isLetter(char)
  487.      * @see        java.lang.Character#isLetterOrDigit(char)
  488.      * @see        java.lang.Character#isUnicodeIdentifierStart(char)
  489.      * @since      JDK1.0.2
  490.      * @deprecated Replaced by isJavaIdentifierStart(char).
  491.      */
  492.     public static boolean isJavaLetter(char ch) {
  493.       return (A[Y[(X[ch>>6]<<5)|((ch>>1)&0x1F)]|(ch&0x1)] & 0x00070000) >= 0x00050000;
  494.     }
  495.  
  496.     /**
  497.      * Determines if the specified character is a 
  498.      * "Java" letter or digit, that is, the character is 
  499.      * permissible as a non-initial character in an identifier in the 
  500.      * Java language. 
  501.      * <p>
  502.      * A character is considered to be a Java letter or digit if and 
  503.      * only if it is a letter, a digit, the ASCII dollar sign character 
  504.      * <code>'$'</code>, or the underscore character <code>'_'</code>. 
  505.      *
  506.      * @param      ch   the character to be tested.
  507.      * @return     <code>true</code> if the character is a Java letter or digit;
  508.      *             <code>false</code> otherwise.
  509.      * @see        java.lang.Character#isJavaIdentifierPart(char)
  510.      * @see        java.lang.Character#isJavaLetter(char)
  511.      * @see        java.lang.Character#isLetter(char)
  512.      * @see        java.lang.Character#isLetterOrDigit(char)
  513.      * @see        java.lang.Character#isUnicodeIdentifierPart(char)
  514.      * @since      JDK1.0.2
  515.      * @deprecated Replaced by isJavaIdentifierPart(char).
  516.      */
  517.     public static boolean isJavaLetterOrDigit(char ch) {
  518.       return (A[Y[(X[ch>>6]<<5)|((ch>>1)&0x1F)]|(ch&0x1)] & 0x00030000) != 0;
  519.     }
  520.  
  521.     /**
  522.      * Determines if the specified character is
  523.      * permissible as the first character in a Java identifier.
  524.      * A character may start a Java identifier if and only if
  525.      * it is one of the following:
  526.      * <ul>
  527.      * <li>  a letter
  528.      * <li>  a currency symbol (such as "$")
  529.      * <li>  a connecting punctuation character (such as "_").
  530.      * </ul>
  531.      *
  532.      * @param   ch      the character to be tested.
  533.      * @return  true if the character may start a Java identifier;
  534.      *          false otherwise.
  535.      * @see     java.lang.Character#isJavaIdentifierPart(char)
  536.      * @see     java.lang.Character#isLetter(char)
  537.      * @see     java.lang.Character#isUnicodeIdentifierStart(char)
  538.      * @since   JDK1.1
  539.      */
  540.     public static boolean isJavaIdentifierStart(char ch) {
  541.       return (A[Y[(X[ch>>6]<<5)|((ch>>1)&0x1F)]|(ch&0x1)] & 0x00070000) >= 0x00050000;
  542.     }
  543.  
  544.     /**
  545.      * Determines if the specified character may be part of a Java
  546.      * identifier as other than the first character.
  547.      * A character may be part of a Java identifier if and only if
  548.      * it is one of the following:
  549.      * <ul>
  550.      * <li>  a letter
  551.      * <li>  a currency symbol (such as "$")
  552.      * <li>  a connecting punctuation character (such as "_").
  553.      * <li>  a digit
  554.      * <li>  a numeric letter (such as a Roman numeral character)
  555.      * <li>  a combining mark
  556.      * <li>  a non-spacing mark
  557.      * <li>  an ignorable control character
  558.      * </ul>
  559.      * 
  560.      * @param   ch      the character to be tested.
  561.      * @return  true if the character may be part of a Unicode identifier; 
  562.      *          false otherwise.
  563.      * @see     java.lang.Character#isIdentifierIgnorable(char)
  564.      * @see     java.lang.Character#isJavaIdentifierStart(char)
  565.      * @see     java.lang.Character#isLetterOrDigit(char)
  566.      * @see     java.lang.Character#isUnicodeIdentifierPart(char)
  567.      * @since   JDK1.1
  568.      */
  569.     public static boolean isJavaIdentifierPart(char ch) {
  570.       return (A[Y[(X[ch>>6]<<5)|((ch>>1)&0x1F)]|(ch&0x1)] & 0x00030000) != 0;
  571.     }
  572.  
  573.     /**
  574.      * Determines if the specified character is
  575.      * permissible as the first character in a Unicode identifier.
  576.      * A character may start a Unicode identifier if and only if
  577.      * it is a letter.
  578.      *
  579.      * @param   ch      the character to be tested.
  580.      * @return  true if the character may start a Unicode identifier;
  581.      *          false otherwise.
  582.      * @see     java.lang.Character#isJavaIdentifierStart(char)
  583.      * @see     java.lang.Character#isLetter(char)
  584.      * @see     java.lang.Character#isUnicodeIdentifierPart(char)
  585.      * @since   JDK1.1
  586.      */
  587.     public static boolean isUnicodeIdentifierStart(char ch) {
  588.       return (A[Y[(X[ch>>6]<<5)|((ch>>1)&0x1F)]|(ch&0x1)] & 0x00070000) == 0x00070000;
  589.     }
  590.  
  591.     /**
  592.      * Determines if the specified character may be part of a Unicode
  593.      * identifier as other than the first character.
  594.      * A character may be part of a Unicode identifier if and only if
  595.      * it is one of the following:
  596.      * <ul>
  597.      * <li>  a letter
  598.      * <li>  a connecting punctuation character (such as "_").
  599.      * <li>  a digit
  600.      * <li>  a numeric letter (such as a Roman numeral character)
  601.      * <li>  a combining mark
  602.      * <li>  a non-spacing mark
  603.      * <li>  an ignorable control character
  604.      * </ul>
  605.      * 
  606.      * @param   ch      the character to be tested.
  607.      * @return  true if the character may be part of a Unicode identifier;
  608.      *          false otherwise.
  609.      * @see     java.lang.Character#isIdentifierIgnorable(char)
  610.      * @see     java.lang.Character#isJavaIdentifierPart(char)
  611.      * @see     java.lang.Character#isLetterOrDigit(char)
  612.      * @see     java.lang.Character#isUnicodeIdentifierStart(char)
  613.      * @since   JDK1.1
  614.      */
  615.     public static boolean isUnicodeIdentifierPart(char ch) {
  616.       return (A[Y[(X[ch>>6]<<5)|((ch>>1)&0x1F)]|(ch&0x1)] & 0x00010000) != 0;
  617.     }
  618.  
  619.     /**
  620.      * Determines if the specified character should be regarded as
  621.      * an ignorable character in a Java identifier or a Unicode identifier.
  622.      * The following Unicode characters are ignorable in a Java identifier
  623.      * or a Unicode identifier:
  624.      * <table>
  625.      * <tr><td>0x0000 through 0x0008,</td>
  626.      *                                 <td>ISO control characters that</td></tr>
  627.      * <tr><td>0x000E through 0x001B,</td> <td>are not whitespace</td></tr>
  628.      * <tr><td>and 0x007F through 0x009F</td></tr>
  629.      * <tr><td>0x200C through 0x200F</td>  <td>join controls</td></tr>
  630.      * <tr><td>0x200A through 0x200E</td>  <td>bidirectional controls</td></tr>
  631.      * <tr><td>0x206A through 0x206F</td>  <td>format controls</td></tr>
  632.      * <tr><td>0xFEFF</td>               <td>zero-width no-break space</td></tr>
  633.      * </table>
  634.      * 
  635.      * @param   ch      the character to be tested.
  636.      * @return  true if the character may be part of a Unicode identifier;
  637.      *          false otherwise.
  638.      * @see     java.lang.Character#isJavaIdentifierPart(char)
  639.      * @see     java.lang.Character#isUnicodeIdentifierPart(char)
  640.      * @since   JDK1.1
  641.      */
  642.     public static boolean isIdentifierIgnorable(char ch) {
  643.       return (A[Y[(X[ch>>6]<<5)|((ch>>1)&0x1F)]|(ch&0x1)] & 0x00070000) == 0x00010000;
  644.     }
  645.  
  646.     /**
  647.      * The given character is mapped to its lowercase equivalent; if the 
  648.      * character has no lowercase equivalent, the character itself is 
  649.      * returned. 
  650.      * <p>
  651.      * A character has a lowercase equivalent if and only if a lowercase 
  652.      * mapping is specified for the character in the Unicode attribute 
  653.      * table. 
  654.      * <p>
  655.      * Note that some Unicode characters in the range 
  656.      * <code>'\u2000'</code> to <code>'\u2FFF'</code> have lowercase 
  657.      * mappings; this method does map such characters to their lowercase 
  658.      * equivalents even though the method <code>isUpperCase</code> does 
  659.      * not return <code>true</code> for such characters. 
  660.      *
  661.      * @param   ch   the character to be converted.
  662.      * @return  the lowercase equivalent of the character, if any;
  663.      *          otherwise the character itself.
  664.      * @see     java.lang.Character#isLowerCase(char)
  665.      * @see     java.lang.Character#isUpperCase(char)
  666.      * @see     java.lang.Character#toTitleCase(char)
  667.      * @see     java.lang.Character#toUpperCase(char)
  668.      * @since   JDK1.0
  669.      */
  670.     public static char toLowerCase(char ch) {
  671.         int val = A[Y[(X[ch>>6]<<5)|((ch>>1)&0x1F)]|(ch&0x1)];
  672.         if ((val & 0x00200000) != 0)
  673.           return (char)(ch + (val >> 22));
  674.         else
  675.           return ch;
  676.     }
  677.  
  678.     /**
  679.      * Converts the character argument to uppercase. A character has an 
  680.      * uppercase equivalent if and only if an uppercase mapping is 
  681.      * specified for the character in the Unicode attribute table. 
  682.      * <p>
  683.      * Note that some Unicode characters in the range 
  684.      * <code>'\u2000'</code> to <code>'\u2000FFF'</code> have uppercase 
  685.      * mappings; this method does map such characters to their titlecase 
  686.      * equivalents even though the method <code>isLowerCase</code> does 
  687.      * not return <code>true</code> for such characters. 
  688.      *
  689.      * @param   ch   the character to be converted.
  690.      * @return  the uppercase equivalent of the character, if any;
  691.      *          otherwise the character itself.
  692.      * @see     java.lang.Character#isLowerCase(char)
  693.      * @see     java.lang.Character#isUpperCase(char)
  694.      * @see     java.lang.Character#toLowerCase(char)
  695.      * @see     java.lang.Character#toTitleCase(char)
  696.      * @since   JDK1.0
  697.      */
  698.     public static char toUpperCase(char ch) {
  699.         int val = A[Y[(X[ch>>6]<<5)|((ch>>1)&0x1F)]|(ch&0x1)];
  700.         if ((val & 0x00100000) != 0)
  701.           return (char)(ch - (val >> 22));
  702.         else
  703.           return ch;
  704.     }
  705.  
  706.     /**
  707.      * Converts the character argument to titlecase. A character has a 
  708.      * titlecase equivalent if and only if a titlecase mapping is 
  709.      * specified for the character in the Unicode attribute table. 
  710.      * <p>
  711.      * Note that some Unicode characters in the range 
  712.      * <code>'\u2000'</code> through <code>'\u2FFF'</code> have titlecase 
  713.      * mappings; this method does map such characters to their titlecase 
  714.      * equivalents even though the method <code>isTitleCase</code> does 
  715.      * not return <code>true</code> for such characters.
  716.      * <p>
  717.      * There are only four Unicode characters that are truly titlecase forms
  718.      * that are distinct from uppercase forms.  As a rule, if a character has no
  719.      * true titlecase equivalent but does have an uppercase mapping, then the
  720.      * Unicode 2.0 attribute table specifies a titlecase mapping that is the
  721.      * same as the uppercase mapping.
  722.      *
  723.      * @param   ch   the character to be converted.
  724.      * @return  the titlecase equivalent of the character, if any;
  725.      *          otherwise the character itself.
  726.      * @see     java.lang.Character#isTitleCase(char)
  727.      * @see     java.lang.Character#toLowerCase(char)
  728.      * @see     java.lang.Character#toUpperCase(char)
  729.      * @since   JDK1.0.2
  730.      */
  731.     public static char toTitleCase(char ch) {
  732.         int val = A[Y[(X[ch>>6]<<5)|((ch>>1)&0x1F)]|(ch&0x1)];
  733.         if ((val & 0x00080000) != 0) {
  734.           // There is a titlecase equivalent.  Perform further checks:
  735.           if ((val & 0x00100000) == 0) {
  736.             // The character does not have an uppercase equivalent, so it must
  737.             // already be uppercase; so add 1 to get the titlecase form.
  738.             return (char)(ch + 1);
  739.           }
  740.           else if ((val & 0x00200000) == 0) {
  741.             // The character does not have a lowercase equivalent, so it must
  742.             // already be lowercase; so subtract 1 to get the titlecase form.
  743.             return (char)(ch - 1);
  744.           }
  745.           else {
  746.             // The character has both an uppercase equivalent and a lowercase
  747.             // equivalent, so it must itself be a titlecase form; return it.
  748.             return ch;
  749.           }
  750.         }
  751.         else if ((val & 0x00100000) != 0) {
  752.           // This character has no titlecase equivalent but it does have an
  753.           // uppercase equivalent, so use that (subtract the signed case offset).
  754.           return (char)(ch - (val >> 22));
  755.         }
  756.         else
  757.           return ch;
  758.     }
  759.  
  760.     /**
  761.      * Returns the numeric value of the character <code>ch</code> in the 
  762.      * specified radix. 
  763.      * <p>
  764.      * If the radix is not in the range <code>MIN_RADIX</code> <= 
  765.      * <code>radix</code> <= <code>MAX_RADIX</code> or if the 
  766.      * value of <code>ch</code> is not a valid digit in the specified 
  767.      * radix, <code>-1</code> is returned. A character is a valid digit 
  768.      * if at least one of the following is true:
  769.      * <ul>
  770.      * <li>The method <code>isDigit</code> is true of the character 
  771.      *     and the Unicode decimal digit value of the character (or its 
  772.      *     single-character decomposition) is less than the specified radix. 
  773.      *     In this case the decimal digit value is returned. 
  774.      * <li>The character is one of the uppercase Latin letters 
  775.      *     <code>'A'</code> through <code>'Z'</code> and its code is less than
  776.      *     <code>radix + 'A' - 10</code>. 
  777.      *     In this case, <code>ch - 'A' + 10</code> 
  778.      *     is returned. 
  779.      * <li>The character is one of the lowercase Latin letters 
  780.      *     <code>'a'</code> through <code>'z'</code> and its code is less than
  781.      *     <code>radix + 'a' - 10</code>. 
  782.      *     In this case, <code>ch - 'a' + 10</code> 
  783.      *     is returned. 
  784.      * </ul>
  785.      *
  786.      * @param   ch      the character to be converted.
  787.      * @param   radix   the radix.
  788.      * @return  the numeric value represented by the character in the
  789.      *          specified radix.
  790.      * @see     java.lang.Character#forDigit(int, int)
  791.      * @see     java.lang.Character#isDigit(char)
  792.      * @since   JDK1.0
  793.      */
  794.     public static int digit(char ch, int radix) {
  795.         int value = -1;
  796.         if (radix >= Character.MIN_RADIX && radix <= Character.MAX_RADIX) {
  797.           int val = A[Y[(X[ch>>6]<<5)|((ch>>1)&0x1F)]|(ch&0x1)];
  798.           int kind = val & 0x1F;
  799.           if (kind == DECIMAL_DIGIT_NUMBER) {
  800.             value = ((ch + (val >> 9)) & 0x1F);
  801.           }
  802.           else if ((val & 0x0000C000) == 0x0000C000) {
  803.             // Java supradecimal digit
  804.             value = ((ch + (val >> 9)) & 0x1F) + 10;
  805.           }
  806.         }
  807.         return (value < radix) ? value : -1;
  808.     }
  809.  
  810.     /**
  811.      * Returns the Unicode numeric value of the character as a
  812.      * nonnegative integer.
  813.      * If the character does not have a numeric value, then -1 is returned.
  814.      * If the character has a numeric value that cannot be represented as a
  815.      * nonnegative integer (for example, a fractional value), then -2
  816.      * is returned.
  817.      *
  818.      * @param   ch      the character to be converted.
  819.      * @param   radix   the radix.
  820.      * @return  the numeric value of the character, as a nonnegative int value;
  821.      *          -2 if the character has a numeric value that is not a
  822.      *          nonnegative integer; -1 if the character has no numeric value.
  823.      * @see     java.lang.Character#forDigit(char)
  824.      * @see     java.lang.Character#isDigit(char)
  825.      * @since   JDK1.1
  826.      */
  827.     public static int getNumericValue(char ch) {
  828.         int val = A[Y[(X[ch>>6]<<5)|((ch>>1)&0x1F)]|(ch&0x1)];
  829.         switch ((val >> 14) & 0x3) {
  830.         default: // cannot occur
  831.         case (0x00000000 >> 14):         // not numeric
  832.             return -1;
  833.         case (0x00004000 >> 14):              // simple numeric
  834.             return (ch + (val >> 9)) & 0x1F;
  835.         case (0x00008000 >> 14)      :       // "strange" numeric
  836.             switch (ch) {
  837.             case '\u0BF1': return 100;          // TAMIL NUMBER ONE HUNDRED
  838.             case '\u0BF2': return 1000;         // TAMIL NUMBER ONE THOUSAND
  839.             case '\u216C': return 50;           // ROMAN NUMERAL FIFTY
  840.             case '\u216D': return 100;          // ROMAN NUMERAL ONE HUNDRED
  841.             case '\u216E': return 500;          // ROMAN NUMERAL FIVE HUNDRED
  842.             case '\u216F': return 1000;         // ROMAN NUMERAL ONE THOUSAND
  843.             case '\u217C': return 50;           // SMALL ROMAN NUMERAL FIFTY
  844.             case '\u217D': return 100;          // SMALL ROMAN NUMERAL ONE HUNDRED
  845.             case '\u217E': return 500;          // SMALL ROMAN NUMERAL FIVE HUNDRED
  846.             case '\u217F': return 1000;         // SMALL ROMAN NUMERAL ONE THOUSAND
  847.             case '\u2180': return 1000;         // ROMAN NUMERAL ONE THOUSAND C D
  848.             case '\u2181': return 5000;         // ROMAN NUMERAL FIVE THOUSAND
  849.             case '\u2182': return 10000;        // ROMAN NUMERAL TEN THOUSAND
  850.             default:       return -2;
  851.             }
  852.         case (0x0000C000 >> 14):           // Java supradecimal
  853.             return ((ch + (val >> 9)) & 0x1F) + 10;
  854.         }
  855.     }
  856.  
  857.     /**
  858.      * Determines if the specified character is ISO-LATIN-1 white space. 
  859.      * This method returns <code>true</code> for the following five 
  860.      * characters only: 
  861.      * <table><code>
  862.      * <tr><td>'\t'</td>  <td>\u0009</td>  <td>HORIZONTAL TABULATION</td></tr>
  863.      * <tr><td>'\n'</td>  <td>\u000A</td>  <td>NEW LINE</td></tr>
  864.      * <tr><td>'\f'</td>  <td>\u000C</td>  <td>FORM FEED</td></tr>
  865.      * <tr><td>'\r'</td>  <td>\u000D</td>  <td>CARRIAGE RETURN</td></tr>
  866.      * <tr><td>'  '</td>
  867.      *                    <td>\u0020</td>  <td>SPACE</td></tr>
  868.      * </code></table>
  869.      *
  870.      * @param      ch   the character to be tested.
  871.      * @return     <code>true</code> if the character is ISO-LATIN-1 white
  872.      *             space; <code>false</code> otherwise.
  873.      * @see        java.lang.Character#isSpaceChar(char)
  874.      * @see        java.lang.Character#isWhitespace(char)
  875.      * @since      JDK1.0
  876.      * @deprecated Replaced by isWhitespace(char).
  877.      */
  878.     public static boolean isSpace(char ch) {
  879.       return (ch <= 0x0020) &&
  880.              (((((1L << 0x0009) |
  881.                  (1L << 0x000A) |
  882.                  (1L << 0x000C) |
  883.                  (1L << 0x000D) |
  884.                  (1L << 0x0020)) >> ch) & 1L) != 0);
  885.     }
  886.  
  887.     /**
  888.      * Determines if the specified character is a Unicode space character.
  889.      * A character is considered to be a space character if and only if
  890.      * it is specified to be a space character by the Unicode 2.0 standard
  891.      * (category "Zs", "Zl, or "Zp" in the Unicode specification data file).
  892.      * 
  893.      * @param   ch      the character to be tested.
  894.      * @return  true if the character is a space character; false otherwise.
  895.      * @see     java.lang.Character#isWhitespace(char)
  896.      * @since   JDK1.1
  897.      */
  898.     public static boolean isSpaceChar(char ch) {
  899.         return (((((1 << SPACE_SEPARATOR) |
  900.                    (1 << LINE_SEPARATOR) |
  901.                    (1 << PARAGRAPH_SEPARATOR))
  902.                   >> (A[Y[(X[ch>>6]<<5)|((ch>>1)&0x1F)]|(ch&0x1)] & 0x1F)) & 1) != 0);
  903.     }
  904.  
  905.     /**
  906.      * Determines if the specified character is white space according to Java.
  907.      * A character is considered to be a Java whitespace character if and only
  908.      * if it satisfies one of the following criteria:
  909.      * <ul>
  910.      * <li> It is a Unicode space separator (category "Zs"), but is not
  911.      *      a no-break space (\u00A0 or \uFEFF).
  912.      * <li> It is a Unicode line separator (category "Zl").
  913.      * <li> It is a Unicode paragraph separator (category "Zp").
  914.      * <li> It is \u0009, HORIZONTAL TABULATION.
  915.      * <li> It is \u000A, LINE FEED.
  916.      * <li> It is \u000B, VERTICAL TABULATION.
  917.      * <li> It is \u000C, FORM FEED.
  918.      * <li> It is \u000D, CARRIAGE RETURN.
  919.      * <li> It is \u001C, FILE SEPARATOR.
  920.      * <li> It is \u001D, GROUP SEPARATOR.
  921.      * <li> It is \u001E, RECORD SEPARATOR.
  922.      * <li> It is \u001F, UNIT SEPARATOR.
  923.      * </ul>
  924.      *
  925.      * @param   ch      the character to be tested.
  926.      * @return  true if the character is a Java whitespace character;
  927.      *          false otherwise.
  928.      * @see     java.lang.Character#isSpaceChar(char)
  929.      * @since   JDK1.1
  930.      */
  931.     public static boolean isWhitespace(char ch) {
  932.       return (A[Y[(X[ch>>6]<<5)|((ch>>1)&0x1F)]|(ch&0x1)] & 0x00070000) == 0x00040000;
  933.     }
  934.  
  935.     /**
  936.      * Determines if the specified character is an ISO control character.
  937.      * A character is considered to be an ISO control character if its
  938.      * code is in the range \u0000 through \u001F or in the range
  939.      * \u007F through \u009F.
  940.      *
  941.      * @param   ch      the character to be tested.
  942.      * @return  true if the character is an ISO control character;
  943.      *          false otherwise.
  944.      *
  945.      * @see     java.lang.Character#isSpaceChar(char)
  946.      * @see     java.lang.Character#isWhitespace(char)
  947.      * @since   JDK1.1
  948.      */
  949.     public static boolean isISOControl(char ch) {
  950.       return (ch <= 0x009F) && ((ch <= 0x001F) || (ch >= 0x007F));
  951.     }
  952.  
  953.     /**
  954.      * Returns a value indicating a character category.
  955.      *
  956.      * @param   ch      the character to be tested.
  957.      * @return  a value of type int, the character category.
  958.      * @see     java.lang.Character#COMBINING_SPACING_MARK
  959.      * @see     java.lang.Character#CONNECTOR_PUNCTUATION
  960.      * @see     java.lang.Character#CONTROL
  961.      * @see     java.lang.Character#CURRENCY_SYMBOL
  962.      * @see     java.lang.Character#DASH_PUNCTUATION
  963.      * @see     java.lang.Character#DECIMAL_DIGIT_NUMBER
  964.      * @see     java.lang.Character#ENCLOSING_MARK
  965.      * @see     java.lang.Character#END_PUNCTUATION
  966.      * @see     java.lang.Character#FORMAT
  967.      * @see     java.lang.Character#LETTER_NUMBER
  968.      * @see     java.lang.Character#LINE_SEPARATOR
  969.      * @see     java.lang.Character#LOWERCASE_LETTER
  970.      * @see     java.lang.Character#MATH_SYMBOL
  971.      * @see     java.lang.Character#MODIFIER_LETTER
  972.      * @see     java.lang.Character#MODIFIER_SYMBOL
  973.      * @see     java.lang.Character#NON_SPACING_MARK
  974.      * @see     java.lang.Character#OTHER_LETTER
  975.      * @see     java.lang.Character#OTHER_NUMBER
  976.      * @see     java.lang.Character#OTHER_PUNCTUATION
  977.      * @see     java.lang.Character#OTHER_SYMBOL
  978.      * @see     java.lang.Character#PARAGRAPH_SEPARATOR
  979.      * @see     java.lang.Character#PRIVATE_USE
  980.      * @see     java.lang.Character#SPACE_SEPARATOR
  981.      * @see     java.lang.Character#START_PUNCTUATION
  982.      * @see     java.lang.Character#SURROGATE
  983.      * @see     java.lang.Character#TITLECASE_LETTER
  984.      * @see     java.lang.Character#UNASSIGNED
  985.      * @see     java.lang.Character#UPPERCASE_LETTER
  986.      * @since   JDK1.1
  987.      */
  988.     public static int getType(char ch) {
  989.         return A[Y[(X[ch>>6]<<5)|((ch>>1)&0x1F)]|(ch&0x1)] & 0x1F;
  990.     }
  991.  
  992.     /**
  993.      * Determines the character representation for a specific digit in 
  994.      * the specified radix. If the value of <code>radix</code> is not a 
  995.      * valid radix, or the value of <code>digit</code> is not a valid 
  996.      * digit in the specified radix, the null character 
  997.      * (<code>'\u0000'</code>) is returned. 
  998.      * <p>
  999.      * The <code>radix</code> argument is valid if it is greater than or 
  1000.      * equal to <code>MIN_RADIX</code> and less than or equal to 
  1001.      * <code>MAX_RADIX</code>. The <code>digit</code> argument is valid if
  1002.      * <code>0 <= digit <= radix</code>. 
  1003.      * <p>
  1004.      * If the digit is less than 10, then 
  1005.      * <code>'0' + digit</code> is returned. Otherwise, the value 
  1006.      * <code>'a' + digit - 10</code> is returned. 
  1007.      *
  1008.      * @param   digit   the number to convert to a character.
  1009.      * @param   radix   the radix.
  1010.      * @return  the <code>char</code> representation of the specified digit
  1011.      *          in the specified radix. 
  1012.      * @see     java.lang.Character#MIN_RADIX
  1013.      * @see     java.lang.Character#MAX_RADIX
  1014.      * @see     java.lang.Character#digit(char, int)
  1015.      * @since   JDK1.0
  1016.      */
  1017.     public static char forDigit(int digit, int radix) {
  1018.         if ((digit >= radix) || (digit < 0)) {
  1019.             return '\0';
  1020.         }
  1021.         if ((radix < MIN_RADIX) || (radix > MAX_RADIX)) {
  1022.             return '\0';
  1023.         }
  1024.         if (digit < 10) {
  1025.             return (char)('0' + digit);
  1026.         } 
  1027.         return (char)('a' - 10 + digit);
  1028.     }
  1029.  
  1030.     /* The character properties are currently encoded into 32 bits in the following manner:
  1031.        10 bits  signed offset used for converting case
  1032.         1 bit   if 1, adding the signed offset converts the character to lowercase
  1033.         1 bit   if 1, subtracting the signed offset converts the character to uppercase
  1034.         1 bit   if 1, this character has a titlecase equivalent (possibly itself)
  1035.         3 bits  0  may not be part of an identifier
  1036.                 1  ignorable control; may continue a Unicode identifier or Java identifier
  1037.                 2  may continue a Java identifier but not a Unicode identifier (unused)
  1038.                 3  may continue a Unicode identifier or Java identifier
  1039.                 4  is a Java whitespace character
  1040.                 5  may start or continue a Java identifier;
  1041.                    may continue but not start a Unicode identifier (underscores)
  1042.                 6  may start or continue a Java identifier but not a Unicode identifier ($)
  1043.                 7  may start or continue a Unicode identifier or Java identifier
  1044.                 Thus:
  1045.                    5, 6, 7 may start a Java identifier
  1046.                    1, 2, 3, 5, 6, 7 may continue a Java identifier
  1047.                    7 may start a Unicode identifier
  1048.                    1, 3, 5, 7 may continue a Unicode identifier
  1049.                    1 is ignorable within an identifier
  1050.                    4 is Java whitespace
  1051.         2 bits  0  this character has no numeric property
  1052.                 1  adding the digit offset to the character code and then
  1053.                    masking with 0x1F will produce the desired numeric value
  1054.                 2  this character has a "strange" numeric value
  1055.                 3  a Java supradecimal digit: adding the digit offset to the
  1056.                    character code, then masking with 0x1F, then adding 10
  1057.                    will produce the desired numeric value
  1058.         5 bits  digit offset
  1059.         4 bits  reserved for future use
  1060.         5 bits  character type
  1061.      */
  1062.  
  1063.   // The following tables and code generated using:
  1064.   // java GenerateCharacter -string -o Character.java.x [10 5 1] [-spec UnicodeData-2.1.2.txt] [-template Character.java.template]
  1065.   // The X table has 1024 entries for a total of 1024 bytes.
  1066.  
  1067.   private static final byte X[] = new byte[1024];
  1068.   private static final String X_DATA =
  1069.     "\u0100\u0302\u0504\u0706\u0908\u0B0A\u0D0C\u0F0E\u1110\u1312\u1514\u1716\u1918"+
  1070.     "\u1B1A\u1C1C\u1C1C\u1C1C\u1C1C\u1E1D\u201F\u2221\u2423\u2625\u2827\u2A29\u2C2B"+
  1071.     "\u2E2D\u1C1C\u302F\u3231\u3433\u1C35\u1C1C\u3736\u3938\u3B3A\u1C1C\u1C1C\u1C1C"+
  1072.     "\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C"+
  1073.     "\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u3C3C\u3E3D\u403F\u4241\u4443"+
  1074.     "\u4645\u4847\u4A49\u4C4B\u4E4D\u504F\u1C1C\u5251\u5453\u5555\u5756\u5758\u1C1C"+
  1075.     "\u5A59\u1C5B\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C"+
  1076.     "\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u5D5C\u5F5E\u3860\u1C61\u6362\u6564\u6766\u6866"+
  1077.     "\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C"+
  1078.     "\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C"+
  1079.     "\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C"+
  1080.     "\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C"+
  1081.     "\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838"+
  1082.     "\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838"+
  1083.     "\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838"+
  1084.     "\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838"+
  1085.     "\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838"+
  1086.     "\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838"+
  1087.     "\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838"+
  1088.     "\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838"+
  1089.     "\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838"+
  1090.     "\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838"+
  1091.     "\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838"+
  1092.     "\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838"+
  1093.     "\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u1C69\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C"+
  1094.     "\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C"+
  1095.     "\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u3838\u3838\u3838\u3838\u3838\u3838\u3838"+
  1096.     "\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838"+
  1097.     "\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838"+
  1098.     "\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838"+
  1099.     "\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838"+
  1100.     "\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838"+
  1101.     "\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838"+
  1102.     "\u3838\u3838\u1C6A\u6B6B\u6B6B\u6B6B\u6B6B\u6B6B\u6B6B\u6B6B\u6B6B\u6B6B\u6B6B"+
  1103.     "\u6B6B\u6B6B\u6B6B\u6B6B\u6B6B\u6B6B\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C"+
  1104.     "\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C"+
  1105.     "\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C"+
  1106.     "\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C"+
  1107.     "\u6C6C\u6C6C\u6C6C\u6C6C\u3838\u3838\u1C6D\u1C1C\u6F6E\u7170\u7272\u7272\u7473"+
  1108.     "\u7675\u7877\u7972\u7B7A\u7D7C";
  1109.  
  1110.   // The Y table has 4032 entries for a total of 8064 bytes.
  1111.  
  1112.   private static final short Y[] = new short[4032];
  1113.   private static final String Y_DATA =
  1114.     "\000\000\000\000\002\004\004\000\000\000\000\000\000\000\004\004\006\010\012"+
  1115.     "\014\016\020\022\024\026\026\026\026\026\030\032\034\036\040\040\040\040\040"+
  1116.     "\040\040\040\040\040\040\040\042\044\046\050\052\052\052\052\052\052\052\052"+
  1117.     "\052\052\052\052\054\056\060\000\000\000\000\000\000\000\000\000\000\000\000"+
  1118.     "\000\000\000\000\062\064\064\066\070\072\074\076\100\102\104\106\110\112\114"+
  1119.     "\116\120\120\120\120\120\120\120\120\120\120\120\122\120\120\120\124\126\126"+
  1120.     "\126\126\126\126\126\126\126\126\126\130\126\126\126\132\134\134\134\134\134"+
  1121.     "\134\134\134\134\134\134\134\134\134\134\134\134\134\134\134\134\134\134\134"+
  1122.     "\136\134\134\134\140\142\142\142\142\142\142\142\144\134\134\134\134\134\134"+
  1123.     "\134\134\134\134\134\134\134\134\134\134\134\134\134\134\134\134\134\146\142"+
  1124.     "\142\150\152\134\134\154\156\160\144\162\164\156\166\170\134\172\174\176\134"+
  1125.     "\134\134\200\202\204\134\206\210\212\142\214\134\216\134\220\220\220\222\224"+
  1126.     "\226\222\230\142\142\142\142\142\142\142\232\134\134\134\134\134\134\134\134"+
  1127.     "\134\234\226\134\236\236\134\134\134\134\134\134\134\134\134\134\134\134\134"+
  1128.     "\134\134\236\236\236\236\236\236\236\236\236\236\236\236\236\236\236\236\236"+
  1129.     "\236\236\236\236\236\236\236\236\236\236\236\172\240\242\244\246\250\172\172"+
  1130.     "\252\254\172\172\256\172\172\260\172\262\264\172\172\172\172\172\172\266\172"+
  1131.     "\172\270\272\172\172\172\274\172\172\172\172\172\172\172\172\172\172\276\236"+
  1132.     "\236\236\300\300\300\300\302\304\300\300\300\306\306\306\306\306\306\306\300"+
  1133.     "\306\306\306\306\306\306\310\300\300\302\306\306\236\236\236\236\236\236\236"+
  1134.     "\236\236\236\236\312\312\312\312\312\312\312\312\312\312\312\312\312\312\312"+
  1135.     "\312\312\312\312\312\312\312\312\312\312\312\312\312\312\312\312\312\312\312"+
  1136.     "\312\236\236\236\236\236\236\236\236\236\236\236\236\236\312\236\236\236\236"+
  1137.     "\236\236\236\236\236\314\236\236\316\236\320\236\236\306\322\324\326\330\332"+
  1138.     "\334\120\120\120\120\120\120\120\120\336\120\120\120\120\340\342\344\126\126"+
  1139.     "\126\126\126\126\126\126\346\126\126\126\126\350\352\354\356\360\362\236\364"+
  1140.     "\364\364\364\134\134\134\134\134\134\134\366\216\236\236\236\236\236\236\370"+
  1141.     "\372\372\372\372\372\374\372\120\120\120\120\120\120\120\120\120\120\120\120"+
  1142.     "\120\120\120\120\126\126\126\126\126\126\126\126\126\126\126\126\126\126\126"+
  1143.     "\126\376\u0100\u0100\u0100\u0100\u0100\u0102\u0100\134\134\134\134\134\134"+
  1144.     "\134\134\134\134\134\134\134\134\134\134\134\u0104\312\u0106\236\236\236\236"+
  1145.     "\134\134\134\134\134\134\134\134\134\134\134\134\134\134\134\134\134\134\134"+
  1146.     "\134\134\134\134\134\u0108\142\u010A\u010C\u010A\u010C\u010A\236\134\134\134"+
  1147.     "\134\134\134\134\134\134\134\134\134\134\134\236\134\134\134\134\236\134\236"+
  1148.     "\236\236\236\236\236\236\236\236\236\236\236\236\236\236\236\236\236\236\236"+
  1149.     "\236\236\236\236\236\236\236\u010E\u0110\u0110\u0110\u0110\u0110\u0110\u0110"+
  1150.     "\u0110\u0110\u0110\u0110\u0110\u0110\u0110\u0110\u0110\u0110\u0110\u0112\u0114"+
  1151.     "\314\314\314\u0116\u0118\u0118\u0118\u0118\u0118\u0118\u0118\u0118\u0118\u0118"+
  1152.     "\u0118\u0118\u0118\u0118\u0118\u0118\u0118\u0118\u011A\u011C\236\236\236\u011E"+
  1153.     "\u0120\u0120\u0120\u0120\u0120\u0120\u0120\u0120\u011E\u0120\u0120\u0120\u0120"+
  1154.     "\u0120\u0120\u0120\u0120\u0120\u0120\u0120\u011E\u0120\u0122\u0122\u0124\u0126"+
  1155.     "\236\236\236\236\236\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128"+
  1156.     "\u0128\u0128\u0128\u0128\u012A\236\236\u0128\u012C\u012E\236\236\236\236\236"+
  1157.     "\236\236\236\236\236\236\u012E\236\236\236\236\236\236\u0130\236\u0130\u0132"+
  1158.     "\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u012A"+
  1159.     "\236\236\u0134\u0128\u0128\u0128\u0128\u0136\u0120\u0120\u0120\u0126\236\236"+
  1160.     "\236\236\236\236\u0138\u0138\u0138\u0138\u0138\u013A\u013C\236\u013E\u0128"+
  1161.     "\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128"+
  1162.     "\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128"+
  1163.     "\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\236\u0128\u0128\u012A\u0128"+
  1164.     "\u0128\u0128\u0128\u0128\u0128\u0128\u012A\u0128\u0128\u0140\u0120\u0120\u0120"+
  1165.     "\u0142\u0144\u0120\u0120\u0146\u0148\u014A\u0120\u0120\236\026\026\026\026"+
  1166.     "\026\236\236\236\236\236\236\236\236\236\236\236\236\236\236\236\236\236\236"+
  1167.     "\236\236\236\236\236\236\236\236\236\236\236\236\236\236\236\236\236\u014C"+
  1168.     "\u014E\u0150\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220"+
  1169.     "\220\220\220\220\220\220\220\220\220\220\236\u0152\u0154\u0156\312\312\312"+
  1170.     "\u014E\u0154\u0156\236\u0104\312\u0106\236\220\220\220\220\220\312\314\u0158"+
  1171.     "\u0158\u0158\u0158\u0158\320\236\236\236\236\236\236\236\u014C\u0154\u0150"+
  1172.     "\220\220\220\u015A\u0150\u015A\u0150\220\220\220\220\220\220\220\220\220\220"+
  1173.     "\u015A\220\220\220\u015A\u015A\236\220\220\236\u0106\u0154\u0156\312\u0106"+
  1174.     "\u015C\u015E\u015C\u0156\236\236\236\236\u015C\236\236\220\u0150\220\312\236"+
  1175.     "\u0158\u0158\u0158\u0158\u0158\220\u0160\u0162\u0162\u0164\u0166\236\236\236"+
  1176.     "\u0106\u0150\220\220\u015A\236\u0150\u015A\u0150\220\220\220\220\220\220\220"+
  1177.     "\220\220\220\u015A\220\220\220\u015A\220\u0150\u015A\220\236\u0106\u0154\u0156"+
  1178.     "\u0106\236\u014C\u0106\u014C\312\236\236\236\236\236\u0150\220\u015A\u015A"+
  1179.     "\236\236\236\u0158\u0158\u0158\u0158\u0158\312\220\u015A\236\236\236\236\236"+
  1180.     "\u014C\u014E\u0150\220\220\220\u0150\u0150\220\u0150\220\220\220\220\220\220"+
  1181.     "\220\220\220\220\u015A\220\220\220\u015A\220\u0150\220\220\236\u0152\u0154"+
  1182.     "\u0156\312\312\u014C\u014E\u015C\u0156\236\u0166\236\236\236\236\236\236\236"+
  1183.     "\u015A\236\236\u0158\u0158\u0158\u0158\u0158\236\236\236\236\236\236\236\236"+
  1184.     "\u014C\u0154\u0150\220\220\220\u015A\u0150\u015A\u0150\220\220\220\220\220"+
  1185.     "\220\220\220\220\220\u015A\220\220\220\u015A\220\236\220\220\236\u0152\u0156"+
  1186.     "\u0156\312\236\u015C\u015E\u015C\u0156\236\236\236\236\u014E\236\236\220\u0150"+
  1187.     "\220\236\236\u0158\u0158\u0158\u0158\u0158\u0166\236\236\236\236\236\236\236"+
  1188.     "\236\u014E\u0150\220\220\u015A\236\220\u015A\220\220\236\u0150\u015A\u015A"+
  1189.     "\220\236\u0150\u015A\236\220\u015A\236\220\220\220\220\u0150\220\236\236\u0154"+
  1190.     "\u014E\u015E\236\u0154\u015E\u0154\u0156\236\236\236\236\u015C\236\236\236"+
  1191.     "\236\236\236\236\u0168\u0158\u0158\u0158\u0158\u016A\u016C\236\236\236\236"+
  1192.     "\236\236\u015C\u0154\u0150\220\220\220\u015A\220\u015A\220\220\220\220\220"+
  1193.     "\220\220\220\220\220\220\u015A\220\220\220\220\220\u0150\220\220\236\236\312"+
  1194.     "\u014E\u0154\u015E\312\u0106\312\312\236\236\236\u014C\u0106\236\236\236\236"+
  1195.     "\220\236\236\u0158\u0158\u0158\u0158\u0158\236\236\236\236\236\236\236\236"+
  1196.     "\236\u0154\u0150\220\220\220\u015A\220\u015A\220\220\220\220\220\220\220\220"+
  1197.     "\220\220\220\u015A\220\220\220\220\220\u0150\220\220\236\236\u0156\u0154\u0154"+
  1198.     "\u015E\u014E\u015E\u0154\312\236\236\236\u015C\u015E\236\236\236\u015A\220"+
  1199.     "\236\236\u0158\u0158\u0158\u0158\u0158\236\236\236\236\236\236\236\236\236"+
  1200.     "\u0154\u0150\220\220\220\u015A\220\u015A\220\220\220\220\220\220\220\220\220"+
  1201.     "\220\220\u015A\220\220\220\220\220\220\220\220\236\236\u0154\u0156\312\236"+
  1202.     "\u0154\u015E\u0154\u0156\236\236\236\236\u015C\236\236\236\236\220\236\236"+
  1203.     "\u0158\u0158\u0158\u0158\u0158\236\236\236\236\236\236\236\236\u0150\220\220"+
  1204.     "\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220"+
  1205.     "\220\u016E\u0170\220\312\312\312\u0106\236\u0172\220\220\220\u0174\312\312"+
  1206.     "\312\u0176\u0178\u0178\u0178\u0178\u0178\314\236\236\236\236\236\236\236\236"+
  1207.     "\236\236\236\236\236\236\236\236\236\236\u0150\u015A\u015A\u0150\u015A\u015A"+
  1208.     "\u0150\236\236\236\220\220\u0150\220\220\220\u0150\220\u0150\u0150\236\220"+
  1209.     "\u0150\u016E\u0170\220\312\312\312\u014C\u0152\236\220\220\u015A\316\312\312"+
  1210.     "\312\236\u0178\u0178\u0178\u0178\u0178\236\220\236\236\236\236\236\236\236"+
  1211.     "\236\236\236\236\236\236\236\236\236\236\u017A\u017A\314\314\314\314\314\314"+
  1212.     "\314\u017C\u017A\u017A\312\u017A\u017A\u017A\u017E\u017E\u017E\u017E\u017E"+
  1213.     "\u0180\u0180\u0180\u0180\u0180\u0104\u0104\u0104\u0182\u0182\u0154\220\220"+
  1214.     "\220\220\u0150\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220"+
  1215.     "\220\236\236\236\u014C\312\312\312\312\312\312\u014E\312\312\u0184\312\312"+
  1216.     "\312\236\236\312\312\312\u014C\u014C\312\312\312\312\312\312\312\312\312\312"+
  1217.     "\236\u014C\312\312\312\u014C\236\236\236\236\236\236\236\236\236\236\236\236"+
  1218.     "\236\236\236\236\236\236\236\u0110\u0110\u0110\u0110\u0110\u0110\u0110\u0110"+
  1219.     "\u0110\u0110\u0110\u0110\u0110\u0110\u0110\u0110\u0110\u0110\u0110\236\236"+
  1220.     "\236\236\236\172\172\172\172\172\172\172\172\172\172\172\172\172\172\172\172"+
  1221.     "\172\172\172\276\236\u011C\236\236\220\220\220\220\220\220\220\220\220\220"+
  1222.     "\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220"+
  1223.     "\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\236\236\u0150"+
  1224.     "\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220"+
  1225.     "\220\220\220\220\220\220\220\220\220\220\220\220\220\220\u015A\236\236\220"+
  1226.     "\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220"+
  1227.     "\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220"+
  1228.     "\220\220\236\236\236\134\134\134\134\134\134\134\134\134\134\134\134\134\134"+
  1229.     "\134\134\134\134\134\134\134\134\134\134\134\134\134\134\134\134\134\134\134"+
  1230.     "\134\134\134\134\134\134\134\134\134\134\172\172\u0186\236\236\134\134\134"+
  1231.     "\134\134\134\134\134\134\134\134\134\134\134\134\134\134\134\134\134\134\134"+
  1232.     "\134\134\134\134\134\134\134\134\134\134\134\134\134\134\134\134\134\134\134"+
  1233.     "\134\134\134\134\236\236\236\u0188\u0188\u0188\u0188\u018A\u018A\u018A\u018A"+
  1234.     "\u0188\u0188\u0188\236\u018A\u018A\u018A\236\u0188\u0188\u0188\u0188\u018A"+
  1235.     "\u018A\u018A\u018A\u0188\u0188\u0188\u0188\u018A\u018A\u018A\u018A\u0188\u0188"+
  1236.     "\u0188\236\u018A\u018A\u018A\236\u018C\u018C\u018C\u018C\u018E\u018E\u018E"+
  1237.     "\u018E\u0188\u0188\u0188\u0188\u018A\u018A\u018A\u018A\u0190\u0192\u0192\u0194"+
  1238.     "\u0196\u0198\u019A\236\u0188\u0188\u0188\u0188\u018A\u018A\u018A\u018A\u0188"+
  1239.     "\u0188\u0188\u0188\u018A\u018A\u018A\u018A\u0188\u0188\u0188\u0188\u018A\u018A"+
  1240.     "\u018A\u018A\u0188\u019C\276\172\u018A\u019E\u01A0\u01A2\306\u019C\276\172"+
  1241.     "\u01A4\u01A4\u01A0\306\u0188\172\236\172\u018A\u01A6\u01A8\306\u0188\172\u01AA"+
  1242.     "\172\u018A\u01AC\u01AE\306\236\u019C\276\172\u01B0\u01B2\u01A0\310\u01B4\u01B4"+
  1243.     "\u01B4\u01B6\u01B4\u01B4\u01B8\u01BA\u01BC\u01BC\u01BC\014\u01BE\u01C0\u01BE"+
  1244.     "\u01C0\014\014\014\014\u01C2\u01B8\u01B8\u01C4\u01C6\u01C6\u01C8\014\u01CA"+
  1245.     "\u01CC\014\u01CE\u01D0\014\u01D2\u01D4\236\236\236\236\236\236\236\236\236"+
  1246.     "\236\236\236\236\236\236\236\236\u01B8\u01B8\u01B8\u01D6\236\102\102\102\u01D8"+
  1247.     "\u01D2\u01DA\u01DC\u01DC\u01DC\u01DC\u01DC\u01D8\u01D2\u01D4\236\236\236\236"+
  1248.     "\236\236\236\236\064\064\064\064\064\064\u01DE\236\236\236\236\236\236\236"+
  1249.     "\236\236\236\236\236\236\236\236\236\236\312\312\312\312\312\312\u01E0\u01E2"+
  1250.     "\u01E4\236\236\236\236\236\236\236\236\236\236\236\236\236\236\236\066\u01E6"+
  1251.     "\066\u01E8\066\u01EA\u01EC\u01EE\u01EC\u01F0\u01E8\066\u01EC\u01EC\u01EC\066"+
  1252.     "\066\066\u01E6\u01E6\u01E6\u01EC\u01EC\u01EE\u01EC\u01E8\u01F2\u01F4\u01F6"+
  1253.     "\236\236\236\236\236\236\236\236\236\236\236\236\u01F8\114\114\114\114\114"+
  1254.     "\u01FA\u01FC\u01FC\u01FC\u01FC\u01FC\u01FC\u01FE\u01FE\u0200\u0200\u0200\u0200"+
  1255.     "\u0200\u0200\u0202\u0202\u0204\u0206\236\236\236\236\236\236\u0208\u0208\u020A"+
  1256.     "\066\066\066\066\066\066\066\066\066\066\066\066\066\066\066\066\066\066\066"+
  1257.     "\066\066\066\066\066\066\066\066\066\066\066\u020A\u020A\066\066\066\066\066"+
  1258.     "\066\066\066\066\066\u020C\236\236\236\236\236\236\236\236\236\236\u020E\u0210"+
  1259.     "\032\u0208\u0210\u0210\u0210\u0208\u020E\u01D8\u020E\032\u0208\u0210\u0210"+
  1260.     "\u020E\u0210\032\032\032\u0208\u020E\u0210\u0210\u0210\u0210\u0208\u0208\u020E"+
  1261.     "\u020E\u0210\u0210\u0210\u0210\u0210\u0210\u0210\u0210\032\u0208\u0208\u0210"+
  1262.     "\u0210\u0208\u0208\u0208\u0208\u020E\032\032\u0210\u0210\u0210\u0210\u0208"+
  1263.     "\u0210\u0210\u0210\u0210\u0210\u0210\u0210\u0210\u0210\u0210\u0210\u0210\u0210"+
  1264.     "\u0210\u0210\032\u020E\u0210\032\u0208\u0208\032\u0208\u0208\u0208\u0208\u0210"+
  1265.     "\u0208\u0210\u0210\u0210\u0210\u0210\u0210\u0210\u0210\u0210\032\u0208\u0208"+
  1266.     "\u0210\u0208\u0208\u0208\u0208\u020E\u0210\u0210\u0208\u0210\u0208\u0208\u0210"+
  1267.     "\u0210\u0210\u0210\u0210\u0210\u0210\u0210\u0210\u0210\u0210\u0210\u0208\u0210"+
  1268.     "\236\236\236\236\236\236\236\u020C\066\066\066\u0210\u0210\066\066\066\066"+
  1269.     "\066\066\066\066\066\066\u0210\066\066\066\u0212\u0214\066\066\066\066\066"+
  1270.     "\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A"+
  1271.     "\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A"+
  1272.     "\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u0166\236\236\066\066\066"+
  1273.     "\066\066\066\066\066\066\066\066\066\066\066\066\066\066\066\u020C\236\236"+
  1274.     "\236\236\236\236\236\236\236\236\236\236\236\066\066\066\066\066\u020C\236"+
  1275.     "\236\236\236\236\236\236\236\236\236\u0216\u0216\u0216\u0216\u0216\u0216\u0216"+
  1276.     "\u0216\u0216\u0216\u0218\u0218\u0218\u0218\u0218\u0218\u0218\u0218\u0218\u0218"+
  1277.     "\u021A\u021A\u021A\u021A\u021A\u021A\u021A\u021A\u021A\u021A\066\066\066\066"+
  1278.     "\066\066\066\066\066\066\066\066\066\u021C\u021C\u021C\u021C\u021C\u021C\u021C"+
  1279.     "\u021C\u021C\u021C\u021C\u021C\u021C\u021E\u021E\u021E\u021E\u021E\u021E\u021E"+
  1280.     "\u021E\u021E\u021E\u021E\u021E\u021E\u0220\236\236\236\236\236\236\236\236"+
  1281.     "\236\236\066\066\066\066\066\066\066\066\066\066\066\066\066\066\066\066\066"+
  1282.     "\066\066\066\066\066\066\066\066\066\066\066\066\066\066\066\066\066\066\066"+
  1283.     "\066\066\066\066\066\066\066\236\236\236\236\236\066\066\066\066\066\066\066"+
  1284.     "\066\066\066\066\066\066\066\066\066\066\066\066\066\066\066\066\066\066\066"+
  1285.     "\066\066\066\066\066\066\066\066\066\066\066\066\066\066\236\236\236\236\236"+
  1286.     "\236\236\236\066\066\066\066\066\066\066\066\066\066\236\236\236\066\066\066"+
  1287.     "\066\066\066\066\066\066\066\066\066\066\066\066\066\066\066\066\u0222\066"+
  1288.     "\u020C\066\066\236\066\066\066\066\066\066\066\066\066\066\066\066\066\066"+
  1289.     "\u0222\066\066\066\066\066\066\066\066\066\066\066\066\066\066\066\066\066"+
  1290.     "\u0222\u0222\066\u020C\236\u020C\066\066\066\u020C\u0222\066\066\066\236\236"+
  1291.     "\236\236\236\236\236\u0224\u0224\u0224\u0224\u0224\u0216\u0216\u0216\u0216"+
  1292.     "\u0216\u0226\u0226\u0226\u0226\u0226\u020C\236\066\066\066\066\066\066\066"+
  1293.     "\066\066\066\066\066\u0222\066\066\066\066\066\066\u020C\006\014\u0228\u022A"+
  1294.     "\016\016\016\016\016\066\016\016\016\016\u022C\u022E\u0230\u0232\u0232\u0232"+
  1295.     "\u0232\312\312\312\u0234\u0236\u0236\066\236\236\236\u0222\u0150\220\220\220"+
  1296.     "\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220"+
  1297.     "\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220"+
  1298.     "\u015A\236\u014C\u0238\300\316\u0150\220\220\220\220\220\220\220\220\220\220"+
  1299.     "\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220"+
  1300.     "\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\u016E\300\316"+
  1301.     "\236\236\u0150\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220"+
  1302.     "\220\220\220\220\u015A\236\u0150\220\220\220\220\220\220\220\220\220\220\220"+
  1303.     "\220\220\220\u015A\u017A\u0180\u0180\u017A\u017A\u017A\u017A\u017A\236\236"+
  1304.     "\236\236\236\236\236\236\236\236\236\236\236\236\236\236\u017A\u017A\u017A"+
  1305.     "\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u0166\236"+
  1306.     "\u0180\u0180\u0180\u0180\u0180\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A"+
  1307.     "\u017A\u017A\u017A\u017A\u017A\236\236\236\236\236\236\236\236\236\236\236"+
  1308.     "\236\236\236\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A"+
  1309.     "\u017A\u017A\u017A\236\u023A\u023C\u023C\u023C\u023C\u023C\u017A\u017A\u017A"+
  1310.     "\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A"+
  1311.     "\u017A\u017A\u017A\u0166\236\236\236\236\236\236\236\u017A\u017A\u017A\u017A"+
  1312.     "\u017A\u017A\236\236\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A"+
  1313.     "\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A"+
  1314.     "\u017A\u0166\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A"+
  1315.     "\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A"+
  1316.     "\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A"+
  1317.     "\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A"+
  1318.     "\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u0166\236\u023A\u017A"+
  1319.     "\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A"+
  1320.     "\u017A\u017A\u017A\236\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A"+
  1321.     "\u017A\u017A\u017A\u017A\u017A\u017A\u0166\220\220\220\220\220\220\220\220"+
  1322.     "\220\220\220\220\220\220\220\220\220\220\220\236\236\236\236\236\236\236\236"+
  1323.     "\236\236\236\236\236\220\220\220\220\220\220\220\220\220\220\220\220\220\220"+
  1324.     "\220\220\220\220\236\236\236\236\236\236\236\236\236\236\236\236\236\236\u023E"+
  1325.     "\u023E\u023E\u023E\u023E\u023E\u023E\u023E\u023E\u023E\u023E\u023E\u023E\u023E"+
  1326.     "\u023E\u023E\u023E\u023E\u023E\u023E\u023E\u023E\u023E\u023E\u023E\u023E\u023E"+
  1327.     "\u023E\u023E\u023E\u023E\u023E\u0240\u0240\u0240\u0240\u0240\u0240\u0240\u0240"+
  1328.     "\u0240\u0240\u0240\u0240\u0240\u0240\u0240\u0240\u0240\u0240\u0240\u0240\u0240"+
  1329.     "\u0240\u0240\u0240\u0240\u0240\u0240\u0240\u0240\u0240\u0240\u0240\220\220"+
  1330.     "\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220"+
  1331.     "\220\220\236\236\236\236\236\236\236\236\236\172\172\172\276\236\236\236\236"+
  1332.     "\236\u0242\172\172\236\236\236\u013E\u0128\u0128\u0128\u0128\u0244\u0128\u0128"+
  1333.     "\u0128\u0128\u0128\u0128\u012A\u0128\u0128\u012A\u012A\u0128\u0132\u012A\u0128"+
  1334.     "\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128"+
  1335.     "\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128"+
  1336.     "\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128"+
  1337.     "\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128"+
  1338.     "\u0128\236\236\236\236\236\236\236\236\236\236\236\236\236\236\236\236\u0132"+
  1339.     "\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128"+
  1340.     "\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128"+
  1341.     "\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128"+
  1342.     "\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128"+
  1343.     "\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128"+
  1344.     "\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128"+
  1345.     "\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u01BE\236\236\236\236\236\236\236"+
  1346.     "\236\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128"+
  1347.     "\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128"+
  1348.     "\u0128\u0128\u0128\u0128\u0128\u0128\u0128\236\u0128\u0128\u0128\u0128\u0128"+
  1349.     "\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128"+
  1350.     "\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\236\236\236\236\236"+
  1351.     "\236\236\236\236\236\236\236\236\236\236\236\236\236\236\236\u0128\u0128\u0128"+
  1352.     "\u0128\u0128\u0128\236\236\236\236\236\236\236\236\236\236\236\236\236\236"+
  1353.     "\236\236\236\236\u0246\u0246\236\236\236\236\236\236\u0248\u024A\u024C\u024E"+
  1354.     "\u024E\u024E\u024E\u024E\u024E\u024E\u0250\236\u0252\014\u01CE\u0254\014\u0256"+
  1355.     "\014\014\u022C\u024E\u024E\u01CC\014\074\u0208\u0258\u025A\014\236\236\u0128"+
  1356.     "\u012A\u012A\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128"+
  1357.     "\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128"+
  1358.     "\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u012A\u025C"+
  1359.     "\u0252\014\u025E\014\u01BE\u0260\u0248\014\026\026\026\026\026\014\u0208\u0262"+
  1360.     "\036\040\040\040\040\040\040\040\040\040\040\040\040\u0264\u0266\046\050\052"+
  1361.     "\052\052\052\052\052\052\052\052\052\052\052\u0268\u026A\u0258\u0252\u01BE"+
  1362.     "\u026C\220\220\220\220\220\u026E\220\220\220\220\220\220\220\220\220\220\220"+
  1363.     "\220\220\220\220\220\220\220\220\220\220\220\300\220\220\220\220\220\220\220"+
  1364.     "\220\220\220\220\220\220\220\220\u015A\236\220\220\220\236\220\220\220\236"+
  1365.     "\220\220\220\236\220\u015A\236\u0270\u0272\u0274\u0276\u0208\u0208\u020A\u020C"+
  1366.     "\236\236\236\236\236\236\066\236";
  1367.  
  1368.   // The A table has 632 entries for a total of 2528 bytes.
  1369.  
  1370.   private static final int A[] = new int[632];
  1371.   private static final String A_DATA =
  1372.     "\001\u018F\001\u018F\001\u018F\004\u012F\004\u018F\004\u018F\004\u014C\000"+
  1373.     "\u0198\000\u0198\000\270\006\272\000\270\000\u0198\000\u0198\000\u0175\000"+
  1374.     "\u0176\000\u0198\000\271\000\370\000\264\000\370\000\230\003\u6069\003\u6069"+
  1375.     "\000\370\000\u0198\000\u0179\000\u0199\000\u0179\000\u0198\000\u0198\u0827"+
  1376.     "\uFE21\u0827\uFE21\u0827\uFE21\u0827\uFE21\000\u0175\000\u0198\000\u0176\000"+
  1377.     "\u019B\005\u0197\000\u019B\u0817\uFE22\u0817\uFE22\u0817\uFE22\u0817\uFE22"+
  1378.     "\000\u0175\000\u0199\000\u0176\000\u0199\001\u018F\000\u014C\000\u0198\006"+
  1379.     "\272\006\272\000\u019C\000\u019C\000\u019B\000\u019C\007\u0182\000\u0195\000"+
  1380.     "\u0199\000\u0194\000\u019C\000\u019B\000\274\000\271\000\u606B\000\u606B\000"+
  1381.     "\u019B\007\u0182\000\u019C\000\u0198\000\u019B\000\u506B\007\u0182\000\u0196"+
  1382.     "\000\u818B\000\u818B\000\u818B\000\u0198\u0827\041\u0827\041\u0827\041\000"+
  1383.     "\u0199\u0827\041\007\042\u0817\042\u0817\042\u0817\042\000\u0199\u0817\042"+
  1384.     "\uE1D7\042\147\041\127\042\uCE67\041\u3A17\042\007\042\147\041\127\042\147"+
  1385.     "\041\127\042\007\042\uE1E7\041\147\041\127\042\u4B17\042\007\042\u34A7\041"+
  1386.     "\u33A7\041\147\041\127\042\u3367\041\u3367\041\147\041\u13E7\041\u32A7\041"+
  1387.     "\u32E7\041\147\041\u33E7\041\007\042\u34E7\041\u3467\041\007\042\007\042\u34E7"+
  1388.     "\041\u3567\041\007\042\u35A7\041\007\041\147\041\127\042\u36A7\041\007\045"+
  1389.     "\007\042\u36A7\041\147\041\127\042\u3667\041\u3667\041\147\041\127\042\u36E7"+
  1390.     "\041\007\042\007\045\007\045\007\045\257\041\177\043\237\042\257\041\177\043"+
  1391.     "\237\042\237\042\147\041\127\042\u13D7\042\007\042\257\041\000\000\000\000"+
  1392.     "\007\042\u3497\042\u3397\042\007\042\u3357\042\u3357\042\007\042\u3297\042"+
  1393.     "\007\042\u32D7\042\u3357\042\007\042\007\042\u33D7\042\u3457\042\u34D7\042"+
  1394.     "\007\042\u34D7\042\u3557\042\007\042\007\042\uCAA7\042\007\042\u3697\042\u3697"+
  1395.     "\042\007\042\u3657\042\u3657\042\u36D7\042\007\042\007\042\000\000\007\044"+
  1396.     "\007\044\007\044\000\073\000\073\007\044\000\073\000\073\000\073\000\000\003"+
  1397.     "\046\003\046\000\070\000\070\007\044\000\000\000\070\000\000\u09A7\041\000"+
  1398.     "\070\u0967\041\u0967\041\u0967\041\000\000\u1027\041\000\000\u0FE7\041\u0FE7"+
  1399.     "\041\007\042\u0827\041\000\000\u0827\041\u0997\042\u0957\042\u0957\042\u0957"+
  1400.     "\042\007\042\u0817\042\u07D7\042\u0817\042\u1017\042\u0FD7\042\u0FD7\042\000"+
  1401.     "\000\u0F97\042\u0E57\042\007\041\007\041\007\041\u0BD7\042\u0D97\042\000\000"+
  1402.     "\007\041\000\000\u1597\042\u1417\042\000\000\u1427\041\u1427\041\u1427\041"+
  1403.     "\u1427\041\000\000\000\000\u1417\042\u1417\042\u1417\042\u1417\042\000\000"+
  1404.     "\000\074\003\046\003\046\000\000\007\045\147\041\127\042\000\000\000\000\147"+
  1405.     "\041\000\000\u0C27\041\u0C27\041\u0C27\041\u0C27\041\000\000\000\000\007\044"+
  1406.     "\000\000\u0C17\042\u0C17\042\u0C17\042\u0C17\042\007\042\000\000\000\070\000"+
  1407.     "\000\003\106\003\106\003\106\000\130\003\106\003\106\000\130\003\106\000\000"+
  1408.     "\007\105\007\105\007\105\000\000\007\105\000\130\000\130\000\000\000\000\000"+
  1409.     "\130\000\000\007\105\007\104\007\105\007\105\003\106\003\u40C9\003\u40C9\000"+
  1410.     "\270\000\330\000\330\000\130\003\106\007\105\000\130\007\105\003\106\000\107"+
  1411.     "\000\107\003\106\003\106\007\104\007\104\003\106\003\106\000\134\000\000\003"+
  1412.     "\046\003\046\003\050\000\000\007\045\003\046\007\045\003\050\003\050\003\050"+
  1413.     "\003\046\003\u7429\003\u7429\007\045\000\000\000\000\003\050\003\050\000\000"+
  1414.     "\006\072\006\072\000\u5A2B\000\u5A2B\000\u802B\000\u6E2B\000\074\000\000\000"+
  1415.     "\000\003\u7429\000\u742B\000\u802B\000\u802B\000\000\007\045\000\070\007\045"+
  1416.     "\003\046\000\000\006\072\007\044\003\046\003\046\000\074\003\u6029\003\u6029"+
  1417.     "\000\074\000\074\000\070\000\074\003\u4029\003\u4029\000\053\000\053\000\065"+
  1418.     "\000\066\003\046\000\070\007\042\u0ED7\042\uFE17\042\uFE17\042\uFE27\041\uFE27"+
  1419.     "\041\007\042\uFE17\042\000\000\uFE27\041\uED97\042\uED97\042\uEA97\042\uEA97"+
  1420.     "\042\uE717\042\uE717\042\uE017\042\uE017\042\uE417\042\uE417\042\uE097\042"+
  1421.     "\uE097\042\007\042\uFDD7\042\uEDA7\041\uEDA7\041\uFDE7\041\000\073\007\041"+
  1422.     "\000\073\uEAA7\041\uEAA7\041\uE727\041\uE727\041\000\000\000\073\007\042\uFE57"+
  1423.     "\042\uE427\041\uE427\041\uFE67\041\000\073\uE027\041\uE027\041\uE0A7\041\uE0A7"+
  1424.     "\041\004\u014C\004\u014C\004\u014C\004\354\001\u0190\001\u0190\001\060\001"+
  1425.     "\120\000\u0194\000\u0194\000\u0195\000\u0196\000\u0195\000\u0195\004\u010D"+
  1426.     "\004\u010E\001\u0190\000\000\000\270\000\270\000\270\000\u0198\000\u0198\000"+
  1427.     "\u0195\000\u0196\000\u0198\000\u0198\005\u0197\005\u0197\000\u0198\000\u0199"+
  1428.     "\000\u0175\000\u0176\000\000\000\u606B\000\000\000\271\000\271\000\u0176\007"+
  1429.     "\u0182\000\u406B\000\u406B\006\272\000\000\003\046\000\047\000\047\000\047"+
  1430.     "\000\047\003\046\007\u0181\000\u019C\000\u019C\007\u0181\007\u0182\007\u0181"+
  1431.     "\007\u0181\007\u0181\007\u0182\007\u0182\007\u0181\007\u0182\007\u0182\007"+
  1432.     "\u0185\007\u0185\007\u0185\007\u0185\000\000\000\000\000\u818B\000\u818B\000"+
  1433.     "\u458B\u0427\u422A\u0427\u422A\u0427\u802A\u0427\u802A\u0417\u622A\u0417\u622A"+
  1434.     "\u0417\u802A\u0417\u802A\007\u802A\007\u802A\007\u802A\000\000\000\u0199\000"+
  1435.     "\u0199\000\u0199\000\u019C\000\u019C\000\000\000\u0199\000\u0179\000\u0179"+
  1436.     "\000\u0179\000\u019C\000\u0175\000\u0176\000\u019C\000\u438B\000\u438B\000"+
  1437.     "\u5B8B\000\u5B8B\000\u738B\000\u738B\u06A0\u019C\u06A0\u019C\u0690\u019C\u0690"+
  1438.     "\u019C\000\u6D8B\000\000\000\000\000\u019C\000\u578B\000\u578B\000\u6F8B\000"+
  1439.     "\u6F8B\000\u019C\007\u0184\000\u0198\007\u738A\000\u0194\000\u0195\000\u0196"+
  1440.     "\000\u0196\000\u019C\007\u402A\007\u402A\007\u402A\000\u0194\007\u0184\007"+
  1441.     "\u0184\007\u0184\003\046\007\044\000\000\000\074\000\u422B\000\u422B\000\063"+
  1442.     "\000\063\000\062\000\062\000\000\007\042\007\105\000\131\003\u0186\003\u0186"+
  1443.     "\000\u0198\000\u0194\000\u0194\005\u0197\005\u0197\000\u0195\000\u0196\000"+
  1444.     "\u0195\000\u0196\000\000\000\000\000\u0198\005\u0197\005\u0197\000\u0198\000"+
  1445.     "\000\000\u0199\000\000\000\u0198\006\u019A\000\000\001\u0190\006\u019A\000"+
  1446.     "\u0198\000\u0198\000\u0199\000\u0199\000\u0198\u0827\uFE21\000\u0195\000\u0198"+
  1447.     "\000\u0196\u0817\uFE22\000\u0195\000\u0199\000\u0196\000\u0198\000\070\007"+
  1448.     "\044\007\045\006\u019A\006\u019A\000\u0199\000\u019B\000\u019C\006\u019A\006"+
  1449.     "\u019A\000\000";
  1450.  
  1451.   // In all, the character property tables require 11616 bytes.
  1452.  
  1453.     static {
  1454.         { // THIS CODE WAS AUTOMATICALLY CREATED BY GenerateCharacter:
  1455.             int len = X_DATA.length();
  1456.             int j=0;
  1457.             for (int i=0; i<len; ++i) {
  1458.                 int c = X_DATA.charAt(i);
  1459.                 for (int k=0; k<2; ++k) {
  1460.                     X[j++] = (byte)c;
  1461.                     c >>= 8;
  1462.                 }
  1463.             }
  1464.             if (j != 1024) throw new RuntimeException();
  1465.         }
  1466.         { // THIS CODE WAS AUTOMATICALLY CREATED BY GenerateCharacter:
  1467.             if (Y_DATA.length() != 4032) throw new RuntimeException();
  1468.             for (int i=0; i<4032; ++i)
  1469.                 Y[i] = (short)Y_DATA.charAt(i);
  1470.         }
  1471.         { // THIS CODE WAS AUTOMATICALLY CREATED BY GenerateCharacter:
  1472.             int len = A_DATA.length();
  1473.             int j=0;
  1474.             int charsInEntry=0;
  1475.             int entry=0;
  1476.             for (int i=0; i<len; ++i) {
  1477.                 entry |= A_DATA.charAt(i);
  1478.                 if (++charsInEntry == 2) {
  1479.                     A[j++] = entry;
  1480.                     entry = 0;
  1481.                     charsInEntry = 0;
  1482.                 }
  1483.                 else {
  1484.                     entry <<= 16;
  1485.                 }
  1486.             }
  1487.             if (j != 632) throw new RuntimeException();
  1488.         }
  1489.  
  1490.     }
  1491. }
  1492.